package fitnesshub.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import fitnesshub.mapper.EquipmentMapper;

import fitnesshub.pojo.dto.AddEquipmentDTO;
import fitnesshub.pojo.dto.EquipmentPageQueryDTO;
import fitnesshub.pojo.entity.Equipment;
import fitnesshub.result.PageResult;
import fitnesshub.service.EquipmentService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class EquipmentServiceImpl implements EquipmentService {

    @Autowired
    private EquipmentMapper equipmentMapper;


    /**
     * 设备分页查询
     * 使用PageHelper进行分页设置，调用EquipmentMapper的对应方法查询设备数据，并封装成PageResult返回
     *
     * @param equipmentPageQueryDTO 包含分页参数及可选查询筛选条件的对象
     * @return PageResult对象，包含分页后的设备数据列表以及总记录数等分页相关信息
     */
    @Override
    public PageResult page(EquipmentPageQueryDTO equipmentPageQueryDTO) {
        PageHelper.startPage(equipmentPageQueryDTO.getPage(), equipmentPageQueryDTO.getPageSize());
        Page<Equipment> page = equipmentMapper.pageQuery(equipmentPageQueryDTO);
        long total = page.getTotal();
        List<Equipment> records = page.getResult();
        return new PageResult(total, records);
    }

    /**
     * 根据设备ID查询单个设备信息
     * 直接调用EquipmentMapper的方法根据传入的设备ID获取对应的设备实体对象
     *
     * @param equipmentId 要查询的设备的唯一标识符（通常是数据库中的主键值）
     * @return Equipment对象，如果找到对应ID的设备，则返回该设备的详细信息实体；否则可能返回null（具体取决于实现逻辑）
     */
    @Override
    public Equipment getById(Integer equipmentId) {
        return equipmentMapper.getById(equipmentId);
    }

    /**
     * 新增设备
     * 将传入的AddEquipmentDTO中的属性值拷贝到新创建的Equipment对象中，设置创建时间和更新时间，然后插入到数据库中
     *
     * @param addEquipmentDTO 包含要新增设备各项信息的数据传输对象
     */
    @Override
    public void addEquipment(AddEquipmentDTO addEquipmentDTO) {
        Equipment equipment = new Equipment();
        // 对象属性拷贝
        BeanUtils.copyProperties(addEquipmentDTO, equipment);
        equipment.setCreateTime(LocalDateTime.now());
        equipment.setUpdateTime(LocalDateTime.now());

        equipmentMapper.insert(equipment);
    }

    /**
     * 编辑（更新）设备信息
     * 设置设备的更新时间，然后调用EquipmentMapper的方法将更新后的设备信息更新到数据库中
     *
     * @param equipment 包含更新后设备信息的实体对象，通常其ID属性用于确定要更新的数据库记录
     */
    @Override
    public void editEquipment(Equipment equipment) {
        equipment.setUpdateTime(LocalDateTime.now());
        equipmentMapper.update(equipment);
    }

    /**
     * 根据设备ID删除设备记录
     * 先检查是否存在关联的使用记录，如果存在则抛出异常，提示无法删除；若不存在关联记录，则调用EquipmentMapper的方法删除对应的设备记录
     *
     * @param equipmentId 要删除的设备的唯一标识符，用于从数据库中定位并删除对应的设备记录
     */
    @Override
    public void deleteById(Integer equipmentId) {
        // 检查是否有关联的使用记录


        // 删除设备
        equipmentMapper.deleteById(equipmentId);
    }
}